package logv

import (
	"context"
	"github.com/rs/zerolog"
)

// Debug 输出调试级别日志
func Debug(msg string) {
	defaultLogger.Debug(msg)
}

// DebugCtx 带context的调试级别日志
func DebugCtx(ctx context.Context, msg string) {
	defaultLogger.DebugCtx(ctx, msg)
}

// Debugf 格式化输出调试级别日志
func Debugf(format string, args ...interface{}) {
	defaultLogger.checkAndRotate()
	defaultLogger.logger.Debug().Msgf(format, args...)
}

// DebugfCtx 带context的格式化调试级别日志
func DebugfCtx(ctx context.Context, format string, args ...interface{}) {
	defaultLogger.checkAndRotate()
	event := defaultLogger.logger.Debug()
	defaultLogger.addContextFields(event, ctx)
	event.Msgf(format, args...)
}

// Info 输出信息级别日志
func Info(msg string) {
	defaultLogger.Info(msg)
}

// InfoCtx 带context的信息级别日志
func InfoCtx(ctx context.Context, msg string) {
	defaultLogger.InfoCtx(ctx, msg)
}

// Infof 格式化输出信息级别日志
func Infof(format string, args ...interface{}) {
	defaultLogger.checkAndRotate()
	defaultLogger.logger.Info().Msgf(format, args...)
}

// InfofCtx 带context的格式化信息级别日志
func InfofCtx(ctx context.Context, format string, args ...interface{}) {
	defaultLogger.checkAndRotate()
	event := defaultLogger.logger.Info()
	defaultLogger.addContextFields(event, ctx)
	event.Msgf(format, args...)
}

// Warn 输出警告级别日志
func Warn(msg string) {
	defaultLogger.Warn(msg)
}

// WarnCtx 带context的警告级别日志
func WarnCtx(ctx context.Context, msg string) {
	defaultLogger.WarnCtx(ctx, msg)
}

// Warnf 格式化输出警告级别日志
func Warnf(format string, args ...interface{}) {
	defaultLogger.checkAndRotate()
	defaultLogger.logger.Warn().Msgf(format, args...)
}

// WarnfCtx 带context的格式化警告级别日志
func WarnfCtx(ctx context.Context, format string, args ...interface{}) {
	defaultLogger.checkAndRotate()
	event := defaultLogger.logger.Warn()
	defaultLogger.addContextFields(event, ctx)
	event.Msgf(format, args...)
}

// Error 输出错误级别日志
func Error(msg string) {
	defaultLogger.Error(msg)
}

// ErrorCtx 带context的错误级别日志
func ErrorCtx(ctx context.Context, msg string) {
	defaultLogger.ErrorCtx(ctx, msg)
}

// Errorf 格式化输出错误级别日志
func Errorf(format string, args ...interface{}) {
	defaultLogger.checkAndRotate()
	defaultLogger.logger.Error().Msgf(format, args...)
}

// ErrorfCtx 带context的格式化错误级别日志
func ErrorfCtx(ctx context.Context, format string, args ...interface{}) {
	defaultLogger.checkAndRotate()
	event := defaultLogger.logger.Error()
	defaultLogger.addContextFields(event, ctx)
	event.Msgf(format, args...)
}

// Fatal 输出致命错误级别日志并退出程序
func Fatal(msg string) {
	defaultLogger.Fatal(msg)
}

// FatalCtx 带context的致命错误级别日志并退出程序
func FatalCtx(ctx context.Context, msg string) {
	defaultLogger.FatalCtx(ctx, msg)
}

// Fatalf 格式化输出致命错误级别日志并退出程序
func Fatalf(format string, args ...interface{}) {
	defaultLogger.checkAndRotate()
	defaultLogger.logger.Fatal().Msgf(format, args...)
}

// FatalfCtx 带context的格式化致命错误级别日志并退出程序
func FatalfCtx(ctx context.Context, format string, args ...interface{}) {
	defaultLogger.checkAndRotate()
	event := defaultLogger.logger.Fatal()
	defaultLogger.addContextFields(event, ctx)
	event.Msgf(format, args...)
}

// WithFields 添加字段后输出日志
func WithFields(fields map[string]interface{}) *zerolog.Event {
	return defaultLogger.WithFields(fields)
}

// WithFieldsCtx 带context添加字段后输出日志
func WithFieldsCtx(ctx context.Context, fields map[string]interface{}) *zerolog.Event {
	return defaultLogger.WithFieldsCtx(ctx, fields)
}

// WithError 添加错误信息后输出日志
func WithError(err error) *zerolog.Event {
	return defaultLogger.WithError(err)
}

// WithErrorCtx 带context添加错误信息后输出日志
func WithErrorCtx(ctx context.Context, err error) *zerolog.Event {
	return defaultLogger.WithErrorCtx(ctx, err)
}

// SetLevel 设置日志级别
func SetLevel(level zerolog.Level) {
	zerolog.SetGlobalLevel(level)
}

// SetLogDir 设置日志目录（重新初始化默认日志器）
func SetLogDir(dir string) {
	if defaultLogger != nil {
		defaultLogger.Close()
	}
	defaultLogger = NewLogger(dir)
}

// Close 关闭默认日志器
func Close() error {
	if defaultLogger != nil {
		return defaultLogger.Close()
	}
	return nil
}

// GetLogger 获取默认日志器实例
func GetLogger() *Logger {
	return defaultLogger
}

// NewCustomLogger 创建自定义日志器
func NewCustomLogger(logDir string) *Logger {
	return NewLogger(logDir)
}

// AddHook 向默认日志器添加钩子
func AddHook(hook Hook) {
	if defaultLogger != nil {
		defaultLogger.AddHook(hook)
	}
}

// RemoveHook 从默认日志器移除钩子
func RemoveHook(hook Hook) {
	if defaultLogger != nil {
		defaultLogger.RemoveHook(hook)
	}
}

// ClearHooks 清空默认日志器的所有钩子
func ClearHooks() {
	if defaultLogger != nil {
		defaultLogger.ClearHooks()
	}
}

// 全局公共字段钩子实例
var globalCommonFieldsHook *CommonFieldsHook

// SetCommonFields 设置全局公共字段，为每个日志都添加这些固定字段
func SetCommonFields(fields map[string]interface{}) {
	if globalCommonFieldsHook == nil {
		globalCommonFieldsHook = NewCommonFieldsHook(fields)
		AddHook(globalCommonFieldsHook)
	} else {
		globalCommonFieldsHook.SetFields(fields)
	}
}

// AddCommonField 添加单个全局公共字段
func AddCommonField(key string, value interface{}) {
	if globalCommonFieldsHook == nil {
		globalCommonFieldsHook = NewCommonFieldsHook(map[string]interface{}{key: value})
		AddHook(globalCommonFieldsHook)
	} else {
		globalCommonFieldsHook.AddField(key, value)
	}
}

// RemoveCommonField 移除单个全局公共字段
func RemoveCommonField(key string) {
	if globalCommonFieldsHook != nil {
		globalCommonFieldsHook.RemoveField(key)
	}
}

// GetCommonFields 获取所有全局公共字段
func GetCommonFields() map[string]interface{} {
	if globalCommonFieldsHook != nil {
		return globalCommonFieldsHook.GetFields()
	}
	return make(map[string]interface{})
}

// ClearCommonFields 清空所有全局公共字段
func ClearCommonFields() {
	if globalCommonFieldsHook != nil {
		globalCommonFieldsHook.SetFields(make(map[string]interface{}))
	}
}

